package com.qinsoft.frame.utils;

import java.util.List;

import com.taobao.api.domain.Item;

/**
 * （单向）链表
 */
public class ItemChain {
	private ItemChainNode head; // 头节点
	private int size; // 链表的实体（即节点的数量）
	private int modCount; // 链表被操作的次数（备用）
	/**
	 * 获得链表中节点数量
	 * @return 链表中节点数
	 */
	public int getSize() {
		return this.size;
	}
	/**
	 * 添加节点的一般方法
	 * @param p
	 * 添加到链表节点的对象 由于实现细节，numIid作为唯一标识，同一个编号的Item只能添加一次
	 */
	public void addNode(Item p) {
		if (!contains(p.getNumIid()+"")) { // 如果链表中没有该对象，则准备添加
			if (head != null) { // 如果有头节点，则添加新节点作为头节点
				head = new ItemChainNode((Item) p, head);
				size++;
				modCount++;
			} else { // 如果没有头节点，则添加对象作为头节点
				head = new ItemChainNode((Item) p, null);
				size++;
				modCount++;
			}
		}
	}
	/**
	 * 批量添加节点方法
	 */
	public void addAllNode(List<Item> list){
		if(!EmptyUtils.isEmptyList(list)){
			for(Item item : list){
				addNode(item);
			}
		}
	}
	/**
	 * 通过numIid删除对象
	 * @param numIid 要删除对象id
	 */
	public void deleteNode(String numIid) {
		if (size == 0) { // 如果当前链表节点数为零
			return;
		}
		if (size == 1) {
			// 如果只有一个节点并且正是需要删除的对象
			if (numIid.equals(head.item.getNumIid()+"")) {
				head = null;
				size = 0;
			}
			return;
		}
		// 如果不存在该对象编号
		if (!contains(numIid)) {
			return;
		}
		// 较为复杂的删除，定义整型保存被删除的节点的索引
		// （删除和索引都是不存在的，这里只是一个说法）
		int index = 0;
		// 循环遍历，找到删除节点的索引
		for (ItemChainNode p = head; p != null; p = p.nextNode) {
			if (!(numIid.equals(p.item.getNumIid()+""))) {
				index++;
			} else {
				break;
			}
		}
		// 如果删除的是第一个节点（即头节点）
		if (index == 0) {
			head = new ItemChainNode(head.nextNode.item, head.nextNode.nextNode); // 设置头节点后一个节点为新的头节点
			size--; // 链表节点数减一
			modCount++; // 链表被操作次数加一
			return;
		}
		// 如果删除的节点不是第一个节点
		// 循环遍历，找到被删除节点的前一个节点
		// 其索引下标用count保存
		int count = 0;
		for (ItemChainNode p = head; p != null; p = p.nextNode) {
			if (count == index - 1) { // 如果找到了被删除节点的前一个节点
				if (index == size - 1) { // 如果被删除节点是最后一个节点
					p.nextNode = null; // 将被删除节点的前一个节点的引用指向空引用
				} else { // 如果被删除节点不是最后一个节点
					p.nextNode = p.nextNode.nextNode; // 将被删除节点前一个节点对其引用指向被删除节点的下一个节点
				}
				size--; // 减一数量
				modCount++; // 加一操作次数
				return;
			}
			count++; // 没有找到，索引加一
		}
	}
	/**
	 * 通过编号查找对象 由于编号是唯一标识，循环遍历查找并返回即可
	 * 
	 * @param numIid 商品id
	 * @return 查找到的对象或者null
	 */
	public Item searchNode(String numIid) {
		Item p = null;
		for (ItemChainNode pcn = head; pcn != null; pcn = pcn.nextNode) {
			if (numIid.equals(pcn.item.getNumIid()+"")) {
				p = pcn.item;
			}
		}
		return p;
	}
	/**
	 * 通过原对象修改及传入值修改该对象属性
	 */
	/*
	 * public void editNode(int personNo, Object value) { // 通过作为唯一标识的编号查找到对象
	 * Item target = searchNode(personNo); if (target == null) { // 如果对象为null
	 * return; } if (value == null) { // 如果传入参数为null return; } // 如果传入参数为字符串类型
	 * if (value.getClass() == java.lang.String.class) { target.name =
	 * value.toString(); return; } try { // 如果传入参数为整型 target.age =
	 * Integer.parseInt(value.toString()); return; } catch (Exception ex) { //
	 * 如果传入参数类型错误 return; } }
	 */

	/**
	 * 通过商品id打印对象
	 * @param numIid 商品id
	 */
	public void printNode(String numIid) {
		Item target = searchNode(numIid);
		if (target == null) {
			return;
		}
		System.out.println(target.toString());
	}
	/**
	 * 判断指定对象是否存在链表中
	 * @param numIid 商品id
	 * @return true表示存在该对象，false表示不存在该对象
	 */
	public boolean contains(String numIid) {
		if (size != 0){
			for (ItemChainNode pcn = head; pcn != null; pcn = pcn.nextNode) {
				if (numIid.equals(pcn.item.getNumIid()+"")){
					return true;
				}
			}
		}
		return false;
	}
	/**
	 * 默认排序，通过numiid排序 使用冒泡排序，增加了判断以提高效率
	 */
	public void sort() {
		boolean jx = true; // 冒泡排序的简化方法
		for (ItemChainNode pcn = head; pcn != null && jx; pcn = pcn.nextNode) {
			jx = false;
			for (ItemChainNode pc = head; pc != null && pc.nextNode != null; pc = pc.nextNode) {
				if (pc.item.getNumIid().intValue() > pc.nextNode.item.getNumIid().intValue()) {
					Item temp = pc.item;
					pc.item = pc.nextNode.item;
					pc.nextNode.item = temp;
					jx = true;
				}
			}
		}
	}
	/**
	 * 打印整个链表
	 */
	public void printAll() {
		if (size != 0) {
			for (ItemChainNode pcn = head; pcn != null; pcn = pcn.nextNode) {
				System.out.println(pcn.item.toString());
			}
		}
	}
}